#include "ModuleDisplayer.h"

////////////////////////////////////////////////////////////////////////////////
void ModuleDisplayer::init(QCVModuleHandlerInterface * parent)
{
  this->parent=parent;
  
  win=new QWidget();
  view=new QLabel(win);
	pb_save=new QPushButton("Sauver l'image",win);
  display_data=new QCheckBox("Afficher des points clefs",win);
	labelised=new QCheckBox("Afficher labelisation",win);
	display_boxes=new QCheckBox(trUtf8("Afficher des boîtes englobantes"),win);
	scroll=new QScrollArea(win);
	scroll->setBackgroundRole(QPalette::Dark);
	scroll->setWidget(view);

	layout=new QVBoxLayout(win);
  layout->addWidget(scroll); 
	layout->addWidget(pb_save);
  layout->addWidget(display_data);	
	layout->addWidget(labelised);
	layout->addWidget(display_boxes);

	colors.push_back(cv::Scalar(255,0,0));
	colors.push_back(cv::Scalar(0,255,0));
	colors.push_back(cv::Scalar(0,0,0255));
	colors.push_back(cv::Scalar(255,255,0));
	colors.push_back(cv::Scalar(0,255,255));
	colors.push_back(cv::Scalar(255,0,255));
	colors.push_back(cv::Scalar(255,128,0));
	colors.push_back(cv::Scalar(0,255,128));
	colors.push_back(cv::Scalar(128,255,0));
	colors.push_back(cv::Scalar(0,128,255));
	colors.push_back(cv::Scalar(128,0,255));
	colors.push_back(cv::Scalar(255,0,128));
	colors.push_back(cv::Scalar(255,128,128));
	colors.push_back(cv::Scalar(128,255,128));
	colors.push_back(cv::Scalar(128,128,255));
	colors.push_back(cv::Scalar(255,255,128));
	colors.push_back(cv::Scalar(128,255,255));
	colors.push_back(cv::Scalar(255,128,255));
	
	connect(pb_save,SIGNAL(clicked()),this,SLOT(s_save()));
}
////////////////////////////////////////////////////////////////////////////////
void ModuleDisplayer::free()
{
	frame.release();
	data.release();
	boxes.release();
	delete win;
}
//////////////////////////////////////////////////////////////////////////////// 
cv::Mat & ModuleDisplayer::process()
{
	if(display_data->isChecked())
	{
		if(!labelised->isChecked())
		{
			for(int i=0;i<data.rows;i++)
			{
				cv::circle(frame,cv::Point(data(i,0),data(i,1)),2,cv::Scalar(255,255,255));
			}
		}
		else
		{
			for(int i=0;i<data.rows;i++)
			{
				if(data(i,6)>=0 && data(i,6)<(int)colors.size())
				{
					cv::circle(frame,cv::Point(data(i,0),data(i,1)),2,colors.at(data(i,6)));
				}
				else
				{
					cv::circle(frame,cv::Point(data(i,0),data(i,1)),2,cv::Scalar(255,255,255));
				}
			}
		}
  }
  
	if(display_boxes->isChecked())
	{
		if(!labelised->isChecked())
		{
			for(int i=0;i<boxes.rows;i++)
			{
				cv::rectangle(frame,cv::Point(boxes(i,0),boxes(i,1)),cv::Point(boxes(i,2),boxes(i,3)),cv::Scalar(255,0,0));
			}
		}
		else
		{
			for(int i=0;i<boxes.rows;i++)
			{
				cv::rectangle(frame,cv::Point(boxes(i,0),boxes(i,1)),cv::Point(boxes(i,2),boxes(i,3)),colors.at((boxes(i,4))%(colors.size())));
			}
		}
	}

	if(!frame.empty())
	{	
		if(frame.depth()==CV_32F)
		{
			frame.convertTo(frame,CV_8U,255);
		}

		if(frame.channels()!=3)
		{
			cvtColor(frame,frame,CV_GRAY2RGB);
		}

		QImage tmp((uchar *)frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGB888);
		view->setPixmap(QPixmap::fromImage(tmp));
		view->setFixedSize(frame.cols, frame.rows);
	}

  return frame;
}
//////////////////////////////tr("%n","",display_data->isChecked())//////////////////////////////////////////////////
void ModuleDisplayer::setInput(int n,const cv::Mat & m)
{
  if(n==0)
  {
    frame=m.clone();
  }	
  else if(n==1)
  {
    if(display_data->isChecked()){data=m.clone();}
		else		
		{
			boxes=m.clone();
		}
  }
	else if(n==2)
	{
		boxes=m.clone();
	}
}
////////////////////////////////////////////////////////////////////////////////
QWidget* ModuleDisplayer::widget()
{
  return win;
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleDisplayer::getName()
{
  return trUtf8("Afficheur d'image");
}
////////////////////////////////////////////////////////////////////////////////
int ModuleDisplayer::nbInputs()
{
  return 1+display_data->isChecked()+display_boxes->isChecked();
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleDisplayer::getParams()
{
	return tr("%n;","",display_data->isChecked())+
				 tr("%n;","",labelised->isChecked())+
				 tr("%n","",display_boxes->isChecked());
}
////////////////////////////////////////////////////////////////////////////////
bool ModuleDisplayer::setParams(QString params)
{
	QStringList list_params=params.split(";");
	
	if(list_params.size()==3)
	{
		display_data->setChecked(list_params[0].toInt());
		labelised->setChecked(list_params[1].toInt());
		display_boxes->setChecked(list_params[2].toInt());
		return true;
	}
	else
	{
		return false;
	}
}
////////////////////////////////////////////////////////////////////////////////
QCVModuleInterface * ModuleDisplayer::clone()
{
	ModuleDisplayer * selfcopy=new ModuleDisplayer;
	return selfcopy;
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleDisplayer::help(int id)
{
	if(id==-2)
	{
		 return tr("Module permettant l'affichage d'une matrice de type image + points clefs + boites englobantes");
	}	
	else if(id==-1)
	{
		 return tr("image");
	}
	else if(id==0)
	{
		return tr("image");
	}
	else if(id==1)
	{
		if(display_data->isChecked()){return tr("keyspoints");}
		else{return tr("boxes");}
	}
	else if(id==2)
	{
		return tr("boxes");
	}
	else
	{
		return tr("erreur");
	}
}
////////////////////////////////////////////////////////////////////////////////
void ModuleDisplayer::s_save()
{
	QString filename=QFileDialog::getSaveFileName(NULL,"Sauver une image","data",tr("*.bmp *.gif *.jpg *.png *.dib"));
	if(!filename.isEmpty())
	{
		cv::Mat buf;
		cvtColor(frame,buf,CV_RGB2BGR);
		cv::imwrite(filename.toAscii().data(),buf);
	}
}
Q_EXPORT_PLUGIN2(ModuleDisplayer_plugin,ModuleDisplayer);                                                                               
